package com.qingshu.common.util.map;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Vector;

/**
 * 当实体类继承该类时, 实体类就具备了转换为Map的能力.
 * 此时只需要调用MapUtil中的toMap方法得到一个HashMap
 * <p>
 * java自带的toMap可以实现对象转Map, 同样,实体类也需要继承一个ResourceBundle超类,
 * 而如果我的实体类是用于请求中的Model, 超类继承来的其他特征会使API文档受到污染
 *
 * @author Huzz
 * @create 2022-02-15 09:37
 */
@SuppressWarnings("all")
public abstract class Bundle {

    /**
     * 取到实体类的值
     *
     * @param key
     * @return
     */
    Object handleGetObject(String key) {
        Object value = null;

        Class clazz = this.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (key.equals(field.getName())) {
                StringBuffer sb = new StringBuffer();
                sb.append("get");
                sb.append(key.substring(0, 1).toUpperCase());
                sb.append(key.substring(1));
                try {
                    Method method = clazz.getMethod(sb.toString());
                    value = method.invoke(this);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }
        }

        return value;
    }

    /**
     * 得到实体类的字段值不为空的字段名称集合
     *
     * @return
     */
    Enumeration<String> getNotEmptyKeys() {
        Vector<String> fieldVector = new Vector<>();
        Class clazz = this.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 字段为空白的不添加
            if (!"".equals(handleGetObject(field.getName()))) {
                fieldVector.add(field.getName());
            }
        }

        return fieldVector.elements();
    }

    /**
     * 所有字段名称集合
     *
     * @return
     */
    Enumeration<String> getKeys() {
        Vector<String> fieldVector = new Vector<>();
        Class clazz = this.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            fieldVector.add(field.getName());
        }

        return fieldVector.elements();
    }

}
